home *** CD-ROM | disk | FTP | other *** search
- /*
- ##########################################################################
- #### ####
- #### The MusicBox Project ####
- #### ============================ ####
- #### ####
- #### Archive.c ####
- #### ####
- #### Version 2.1os -- September 29, 2000 ####
- #### ####
- #### Copyright (C) 1994 Thomas Dreibholz ####
- #### 2000 Molbachweg 7 ####
- #### 51674 Wiehl ####
- #### Germany ####
- #### ####
- #### EMail: Dreibholz@bigfoot.com ####
- #### WWW: http://www.bigfoot.com/~dreibholz ####
- #### ####
- ##########################################################################
- */
- /***************************************************************************
- * *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- ***************************************************************************/
-
- /* MusicBoxArchive Hauptprogramm */
-
- #include "Archive.h"
- #include "MusicBox.h"
- #include "MusicBoxLibrary.h"
-
- struct Library *GfxBase;
- extern struct Library *IconBase;
- struct Library *WorkbenchBase;
- struct Library *DiskfontBase;
- struct IntuitionBase *IntuitionBase;
- struct Library *GadToolsBase;
- struct Library *LocaleBase;
- struct Library *MusicBoxBase;
- struct Library *AmigaGuideBase;
-
- extern struct TextAttr topaz11;
- extern struct WBenchMsg *WBenchMsg;
- extern struct Menu *KatalogMenus;
- extern struct Window *KatalogWnd;
- extern struct Screen *Scr;
- extern struct TextFont *Font;
- extern struct DiskObject AudioCD;
- extern struct DiskObject MBArchiv;
- extern struct Gadget *KatalogGadgets[4];
-
- struct RastPort *RPort;
- struct MsgPort *AppPort;
- struct MsgPort *ControlPort;
- struct AppItem *AppItem;
- struct AppIcon *AppIcon;
- struct List Liste1,Liste2;
- struct Remember *CatRemember=NULL,
- *TitelRemember=NULL;
- struct TextFont *DisplayFont,
- *TimesFont;
- struct Katalog *Katalog;
- struct Locale *Locale;
- struct Catalog *Catalog;
-
- struct Katalog *AuswahlK=NULL;
- UWORD AuswahlN=0,AuswahlT=0;
- ULONG Discs=0,Titel=0,Stds=0,Mins=0,Seks=0,Frames=0;
- ULONG ControlSignalMask,
- IDCMPSignalMask,
- AppSignalMask;
-
- UWORD ArgTitel=0;
- UWORD ArgKNum=0xFFFF;
- ULONG ArgID=0;
-
- UWORD ox,oy;
- UBYTE *VerStr=VERSTR;
- UBYTE ASave=1;
- UBYTE zero=0;
-
- BOOL LowRes=FALSE;
- BOOL USModus=FALSE;
- BOOL Quiet=FALSE;
- BOOL NoReq=FALSE;
- BOOL NoTT=FALSE;
- BOOL FastExit=FALSE;
-
- struct TextAttr DisplayAttr={"hifi-display.font",18,FS_NORMAL,FPF_DISKFONT};
- struct TextAttr TimesAttr={"times.font",18,FS_NORMAL,FPF_DISKFONT};
-
- void Find();
- LONG MultiRequest();
- void Error();
- int ControlHandler();
- void Iconify();
- void LadeKataloge();
- void KatalogeSichern();
- void ZeigePrefs();
- void PrefsLaden();
- void Liste1Clicked();
- void Liste2Clicked();
- void ZeigeLogo();
-
- void PutText(x,y,text)
- int x,y;
- UBYTE *text;
- {
- if(LowRes==TRUE) y-=35;
- PutTextA(KatalogWnd,x,y,text);
- }
-
- void PutMText2(x,y,text,l)
- int x,y;
- UBYTE *text;
- int l;
- {
- if(LowRes==TRUE) y-=35;
- PutMText(KatalogWnd,x,y,text,l);
- }
-
- UBYTE *GS(num,def)
- LONG num;
- UBYTE *def;
- {
- if(Catalog==NULL) return(def);
- return(GetCatalogStr(Catalog,num,def));
- }
-
- void CloseAll()
- {
- CloseKatalogWindow();
- CloseDownScreen();
- EntferneIcon();
- if(AppPort) DeletePortA(AppPort);
- if(ControlPort) DeleteMMPort(ControlPort);
- if(TitelRemember) FreeRemember(TitelRemember,TRUE);
- if(CatRemember) FreeRemember(CatRemember,TRUE);
- if(DisplayFont) CloseFont(DisplayFont);
- if(TimesFont) CloseFont(TimesFont);
- if(LocaleBase)
- {
- if(Catalog) CloseCatalog(Catalog);
- if(Locale) CloseLocale(Locale);
- CloseLibrary(LocaleBase);
- }
- if(GfxBase) CloseLibrary(GfxBase);
- if(IntuitionBase) CloseLibrary(IntuitionBase);
- if(IconBase) CloseLibrary(IconBase);
- if(MusicBoxBase) CloseLibrary(MusicBoxBase);
- if(AmigaGuideBase) CloseLibrary(AmigaGuideBase);
- if(WorkbenchBase) CloseLibrary(WorkbenchBase);
- if(DiskfontBase) CloseLibrary(DiskfontBase);
- if(GadToolsBase) CloseLibrary(GadToolsBase);
- exit(0);
- }
-
- void OpenAll()
- {
- register int test;
- struct TagItem tag[2];
-
- if(USModus==FALSE)
- {
- LocaleBase=OpenLibrary("locale.library",38L);
- if(LocaleBase!=NULL)
- {
- Locale=OpenLocale(NULL);
- if(Locale!=NULL)
- Catalog=OpenCatalogA(Locale,"musicbox.catalog",NULL);
- }
- }
- GfxBase=OpenLibrary("graphics.library",37L);
- IntuitionBase=OpenLibrary("intuition.library",37L);
- if((GfxBase==NULL)||(IntuitionBase==NULL))
- {
- puts(GS(1,"This program requires Kickstart 2.0, V37!"));
- CloseAll();
- }
- AmigaGuideBase=OpenLibrary("amigaguide.library",0L);
- MusicBoxBase=OpenLibrary("musicbox.library",0L);
- if(MusicBoxBase==NULL)
- {
- Error(GS(55,"Unable to open musicbox.library"));
- CloseAll();
- }
- if((UnIconifyArchive())==0) CloseAll();
- if((LibVersionCheck(VERSION))==0)
- CloseAll();
- IconBase=OpenLibrary("icon.library",0L);
- if(IconBase==NULL)
- {
- Error(GS(2,"Unable to open icon.library!"));
- CloseAll();
- }
- WorkbenchBase=OpenLibrary("workbench.library",37L);
- if(WorkbenchBase==NULL)
- {
- Error(GS(3,"Unable to open workbench.library!"));
- CloseAll();
- }
- GadToolsBase=OpenLibrary("gadtools.library",37L);
- if(GfxBase==NULL)
- {
- Error(GS(4,"Unable to open gadtools.library!"));
- CloseAll();
- }
- DiskfontBase=OpenLibrary("diskfont.library",0L);
- if(GfxBase==NULL)
- {
- Error(GS(5,"Unable to open diskfont.library!"));
- CloseAll();
- }
- AppPort=CreatePortA(0L,0L);
- ControlPort=CreatePortA(ARCHIVE_HOSTNAME,0L);
- if((AppPort==NULL)||(ControlPort==NULL))
- {
- Error(GS(12,"Unable to create a message port"));
- CloseAll();
- }
- AppSignalMask=(1L<<AppPort->mp_SigBit);
- ControlSignalMask=(1L<<ControlPort->mp_SigBit);
- DisplayFont=OpenDiskFont(&DisplayAttr),
- TimesFont=OpenDiskFont(&TimesAttr);
- if(TimesFont==NULL)
- {
- Error(GS(11,"Unable to open font: times.font 18"));
- CloseAll();
- }
- Katalog=AllocRemember(&CatRemember,sizeof(struct Katalog),MEMF_ANY);
- if(Katalog==NULL)
- {
- Error(GS(6,"Not enough memory!"));
- CloseAll();
- }
- test=SetupScreen();
- if(test!=0)
- CloseAll();
- test=InitIcon();
- if(test==FALSE) return;
- NewListA(&Liste1);
- NewListA(&Liste2);
- LadeKataloge();
- PrefsLaden();
-
- if(Quiet==FALSE)
- {
- test=OpenKatalogWindow();
- if(test!=0)
- CloseAll();
- }
- else
- Iconify();
-
- RPort=KatalogWnd->RPort;
- ox=KatalogWnd->BorderLeft;
- oy=KatalogWnd->BorderTop;
-
- ZeigePrefs();
- ZeigeLogo();
- tag[0].ti_Tag=GTLV_Labels;
- tag[0].ti_Data=&Liste2;
- tag[1].ti_Tag=TAG_DONE;
- GTSetGadgetAttrsA(KatalogGadgets[2],KatalogWnd,NULL,&tag);
- if(ArgKNum!=0xFFFF)
- {
- Liste2Clicked(ArgKNum);
- Liste1Clicked(ArgTitel);
- ArgKNum=0xFFFF;
- }
- }
-
- LONG MultiRequest(titel,text,gads)
- UBYTE *titel,*text,*gads;
- {
- struct EasyStruct easy;
-
- easy.es_StructSize=sizeof(struct EasyStruct);
- easy.es_Flags=0;
- easy.es_Title=titel;
- easy.es_TextFormat=text;
- easy.es_GadgetFormat=gads;
- return(EasyRequestArgs(NULL,&easy,0L,0L));
- }
-
- void Error(text)
- {
- if(NoReq==FALSE) MultiRequest(GS(17,"Music Box Archive - Error!"),text,GS(16,"Abort"));
- }
-
- void ZeigeTitel()
- {
- UBYTE text[100];
- register struct KatalogEintrag *ke;
-
- SetAPen(RPort,0);
- if(LowRes==FALSE)
- RectFill(RPort,ox + 7, oy + 202, ox+596, oy+240);
- else
- RectFill(RPort,ox + 7, oy + 167, ox+596, oy+205);
- SetAPen(RPort,FARBE);
- if(AuswahlK)
- {
- PutMText2(11,198,&AuswahlK->CDName,560);
- if(AuswahlT!=0)
- {
- ke=&AuswahlK->KE[AuswahlT-1];
- sprintf(&text,"%s (%d:%02d '%02d)",
- ke->Titel,
- ke->TAdresse/75/60,
- (ke->TAdresse/75) % 60,
- ke->TAdresse % 75);
- PutMText2(11,219,&text,560);
- }
- }
- }
-
- void KatalogInformation()
- {
- UBYTE t1[12],t2[12],t3[20];
- struct InfoStruct info;
-
- info.Title=GS(82,"MusicBox Archive - Information");
- info.ProgName=TITEL;
- info.LowRes=LowRes;
- info.Icon=&MBArchiv;
- info.Text[0].LeftEdge=95;
- info.Text[0].TopEdge=85;
- info.Text[0].Flags=ISTF_LEFT;
- info.Text[0].Text=GS(52,"Total archived CDs:");
-
- info.Text[1].LeftEdge=95;
- info.Text[1].TopEdge=100;
- info.Text[1].Flags=ISTF_LEFT;
- info.Text[1].Text=GS(53,"Total titles:");
-
- info.Text[2].LeftEdge=95;
- info.Text[2].TopEdge=115;
- info.Text[2].Flags=ISTF_LEFT;
- info.Text[2].Text=GS(54,"Total playing time:");
-
- sprintf(&t1,"%ld",Discs);
- info.Text[3].LeftEdge=360;
- info.Text[3].TopEdge=85;
- info.Text[3].Flags=ISTF_RIGHT;
- info.Text[3].Text=&t1;
-
- sprintf(&t2,"%ld",Titel);
- info.Text[4].LeftEdge=360;
- info.Text[4].TopEdge=100;
- info.Text[4].Flags=ISTF_RIGHT;
- info.Text[4].Text=&t2;
-
- sprintf(&t3,"%2ld:%02ld:%02ld '%02ld",Stds,Mins,Seks,Frames);
- info.Text[5].LeftEdge=360;
- info.Text[5].TopEdge=115;
- info.Text[5].Flags=ISTF_RIGHT;
- info.Text[5].Text=&t3;
- info.Text[6].LeftEdge=0;
-
- info.RegInfo=NULL;
-
- SleepPointer(KatalogWnd);
- InformationA(&info);
- ClearPointer(KatalogWnd);
- }
-
- void Liste1Clicked(code)
- UWORD code;
- {
- register int i;
- register struct TNode *node;
- register struct StringInfo *si;
-
- AuswahlT=code;
- if(code==0) return;
-
- node=Liste2.lh_Head;
- for(i=0;i<code;i++) node=node->Node.ln_Succ;
-
- si=KatalogGadgets[1]->SpecialInfo;
- strcpy(si->Buffer,&AuswahlK->KE[code-1].Titel);
- RefreshGList(KatalogGadgets[1],KatalogWnd,NULL,1L);
- ZeigeTitel();
- }
-
- void Liste2Clicked(code)
- UWORD code;
- {
- register int i;
- register struct CNode *node;
- register struct TNode *n;
- register struct Katalog *cat;
- register struct StringInfo *si;
- struct TagItem tag[2];
-
- NewListA(&Liste1);
- node=Liste2.lh_Head;
- for(i=0;i<code;i++) node=node->Node.ln_Succ;
- if(TitelRemember)
- {
- FreeRemember(TitelRemember,TRUE);
- TitelRemember=NULL;
- }
- cat=node->Katalog;
-
- si=KatalogGadgets[3]->SpecialInfo;
- strcpy(si->Buffer,&cat->CDName);
- RefreshGList(KatalogGadgets[3],KatalogWnd,NULL,1L);
-
- n=AllocRemember(&TitelRemember,sizeof(struct TNode),MEMF_ANY|MEMF_CLEAR);
- if(n!=NULL)
- {
- n->Node.ln_Name=&n->Titel,
- sprintf(&n->Titel,"%s:",&cat->CDName);
- AddHead(&Liste1,n);
- }
- else
- {
- Error(GS(6,"Not enough memory!"));
- CloseAll();
- }
- for(i=0;i<cat->Anzahl;i++)
- {
- n=AllocRemember(&TitelRemember,sizeof(struct TNode),MEMF_ANY|MEMF_CLEAR);
- if(n!=NULL)
- {
- n->Node.ln_Name=&n->Titel;
- if(LowRes==FALSE)
- sprintf(&n->Titel,"%02d %s",i+1,&cat->KE[i].Titel);
- else
- sprintf(&n->Titel,"%02d %s",i+1,&cat->KE[i].Titel);
- AddTail(&Liste1,n);
- }
- else
- {
- Error(GS(6,"Not enough memory!"));
- CloseAll();
- }
- }
- tag[0].ti_Tag=GTLV_Labels;
- tag[0].ti_Data=&Liste1;
- tag[1].ti_Tag=TAG_DONE;
- GTSetGadgetAttrsA(KatalogGadgets[0],KatalogWnd,NULL,&tag);
- si=KatalogGadgets[1]->SpecialInfo;
- strcpy(si->Buffer,"");
- RefreshGList(KatalogGadgets[1],KatalogWnd,NULL,1L);
- AuswahlK=cat;
- AuswahlN=code;
- AuswahlT=0;
- ZeigeTitel();
- }
-
- void String1Clicked()
- {
- register int i;
- register struct CNode *node;
- register struct TNode *n;
- register struct Katalog *cat;
- register struct StringInfo *si;
- struct TagItem tag[2];
-
- if(AuswahlK!=NULL)
- {
- if(AuswahlT!=0)
- {
- node=Liste2.lh_Head;
- for(i=0;i<AuswahlN;i++) node=node->Node.ln_Succ;
- cat=node->Katalog;
- si=KatalogGadgets[1]->SpecialInfo;
- strcpy(&cat->KE[AuswahlT-1].Titel,si->Buffer);
- node->Update=1;
- n=Liste1.lh_Head;
- for(i=0;i<AuswahlT;i++) n=n->Node.ln_Succ;
- if(LowRes==FALSE)
- sprintf(&n->Titel,"%02d %s",AuswahlT,si->Buffer);
- else
- sprintf(&n->Titel,"%02d %s",AuswahlT,si->Buffer);
- tag[0].ti_Tag=GTLV_Labels;
- tag[0].ti_Data=&Liste1;
- tag[1].ti_Tag=TAG_DONE;
- GTSetGadgetAttrsA(KatalogGadgets[0],KatalogWnd,NULL,&tag);
- strcpy(si->Buffer,"");
- RefreshGList(KatalogGadgets[1],KatalogWnd,NULL,1L);
- AuswahlT=0;
- ZeigeTitel();
- }
- }
- }
-
- void String2Clicked()
- {
- register int i;
- register struct CNode *node;
- register struct TNode *n;
- register struct Katalog *cat;
- register struct StringInfo *si;
- struct TagItem tag[2];
-
- if(AuswahlK!=NULL)
- {
- node=Liste2.lh_Head;
- for(i=0;i<AuswahlN;i++) node=node->Node.ln_Succ;
- cat=node->Katalog;
- si=KatalogGadgets[3]->SpecialInfo;
- strcpy(&cat->CDName,si->Buffer);
- node->Update=1;
- tag[0].ti_Tag=GTLV_Labels;
- tag[0].ti_Data=&Liste2;
- tag[1].ti_Tag=TAG_DONE;
- GTSetGadgetAttrsA(KatalogGadgets[2],KatalogWnd,NULL,&tag);
- n=Liste1.lh_Head;
- sprintf(&n->Titel,"%s:",&cat->CDName);
- tag[0].ti_Tag=GTLV_Labels;
- tag[0].ti_Data=&Liste1;
- tag[1].ti_Tag=TAG_DONE;
- GTSetGadgetAttrsA(KatalogGadgets[0],KatalogWnd,NULL,&tag);
- ZeigeTitel();
- }
- }
-
- void AutoSave(item)
- struct MenuItem *item;
- {
- if(item->Flags & CHECKED) ASave=1; else ASave=0;
- }
-
-
- void main(argc,argv)
- long argc;
- UBYTE *argv[];
- {
- REGISTER ULONG Signale;
- REGISTER UBYTE *name;
- register int i,test;
- register struct DiskObject *di;
- register struct WBArg *wb;
-
- if(argc>1)
- {
- if(!(strcmp(argv[1],"?")))
- {
- printf("USAGE: %s [-q|QUIET -u|US -l|LOWRES -r|NOREQ\n",argv[0]);
- puts(" -i|IGNORETOOLTYPES -f|FASTEXIT]");
- exit(0);
- }
- for(test=1;test<argc;test++)
- {
- if(!(strcmp(argv[test],"-q"))) Quiet=TRUE;
- if(!(strcmp(argv[test],"QUIET"))) Quiet=TRUE;
- if(!(strcmp(argv[test],"-u"))) USModus=TRUE;
- if(!(strcmp(argv[test],"US"))) USModus=TRUE;
- if(!(strcmp(argv[test],"-l"))) LowRes=TRUE;
- if(!(strcmp(argv[test],"LOWRES"))) LowRes=TRUE;
- if(!(strcmp(argv[test],"-r"))) NoReq=TRUE;
- if(!(strcmp(argv[test],"NOREQ"))) NoReq=TRUE;
- if(!(strcmp(argv[test],"-i"))) NoTT=TRUE;
- if(!(strcmp(argv[test],"IGNORETOOLTYPES"))) NoTT=TRUE;
- if(!(strcmp(argv[test],"-f"))) FastExit=TRUE;
- if(!(strcmp(argv[test],"FASTEXIT"))) FastExit=TRUE;
- }
- }
-
- if(argc==0)
- {
- wb=WBenchMsg->sm_ArgList;
- name=wb->wa_Name;
- }
- else
- name=argv[0];
-
- if(NoTT==FALSE)
- {
- IconBase=OpenLibrary("icon.library",0L);
- if(IconBase!=NULL)
- {
- di=GetDiskObject(name);
- if(di!=NULL)
- {
- name=FindToolType(di->do_ToolTypes,"QUIET");
- if(name) if((MatchToolValue(name,"ON"))) Quiet=TRUE;
- name=FindToolType(di->do_ToolTypes,"FASTEXIT");
- if(name) if((MatchToolValue(name,"ON"))) FastExit=TRUE;
- name=FindToolType(di->do_ToolTypes,"US");
- if(name) if((MatchToolValue(name,"ON"))) USModus=TRUE;
- name=FindToolType(di->do_ToolTypes,"LOWRES");
- if(name) if((MatchToolValue(name,"ON"))) LowRes=TRUE;
- FreeDiskObject(di);
- }
- CloseLibrary(IconBase);
- IconBase=NULL;
- }
- }
-
- if(argc!=1)
- {
- if(argc>=5)
- {
- if( (!(strcmp(argv[1],"DISCID"))) && (!(strcmp(argv[3],"TITLE"))) )
- {
- sscanf(argv[2],"%lx",&ArgID);
- ArgTitel=atol(argv[4]);
- }
- if(argc>5)
- {
- if(!(strcmp(argv[5],"QUIET"))) Quiet=TRUE;
- else if(!(strcmp(argv[5],"LOWRES"))) LowRes=TRUE;
- if(argc>6)
- if(!(strcmp(argv[6],"LOWRES"))) LowRes=TRUE;
- }
- }
- }
-
- OpenAll();
-
- IDCMPSignalMask=(1L<<KatalogWnd->UserPort->mp_SigBit);
- do
- {
- Signale=Wait(IDCMPSignalMask+ControlSignalMask);
- if(Signale & IDCMPSignalMask)
- test=HandleKatalogIDCMP();
-
- if(Signale & ControlSignalMask)
- if((ControlHandler())==1) test=2;
-
- if(test==2)
- {
- Iconify();
- test=1;
- }
-
- } while(test==1);
-
- KatalogeSichern();
- CloseAll();
- }
-
-
- void Iconify()
- {
- REGISTER ULONG Signale;
- REGISTER BOOL ende;
- register int test;
-
- AppItem=AddAppMenuItemA(0L,0L,"Music Box Archive",AppPort,NULL);
- if(AppItem!=NULL)
- {
- AppIcon=AddAppIconA(1L,0L,"Music Box Archive",AppPort,0L,&MBArchiv,0L);
- if(AppIcon!=NULL)
- {
- CloseKatalogWindow();
- KatalogeSichern();
- AuswahlK=NULL;
- AuswahlT=AuswahlN=0;
-
- ende=FALSE;
- while(ende==FALSE)
- {
- Signale=Wait(AppSignalMask+ControlSignalMask);
- if(Signale & ControlSignalMask)
- if((ControlHandler())==2) ende=TRUE;
-
- if(Signale & AppSignalMask)
- {
- WaitPort(AppPort);
- ReplyMsg(GetMsg(AppPort));
- ende=TRUE;
- }
- }
-
- test=OpenKatalogWindow();
- if(test!=0)
- {
- RemoveAppIcon(AppIcon);
- RemoveAppMenuItem(AppItem);
- CloseAll();
- }
- RPort=KatalogWnd->RPort;
- ox=KatalogWnd->BorderLeft;
- oy=KatalogWnd->BorderTop;
- ZeigePrefs();
- if(ArgKNum!=0xFFFF)
- {
- Liste2Clicked(ArgKNum);
- Liste1Clicked(ArgTitel);
- ArgKNum=0xFFFF;
- }
-
- ZeigeLogo();
- ZeigeTitel();
- RemoveAppIcon(AppIcon);
- }
- RemoveAppMenuItem(AppItem);
- CleanUpPort(AppPort);
- }
- }
-
- /*
- Stringvergleich für Sortierung:
- => TRUE, wenn String B vor A liegt
- FALSE, wenn String A vor B liegt
- */
- BOOL CmpStrings(a,b)
- UBYTE *a,*b;
- {
- register int l1,l2,l,i;
-
- l1=strlen(a);
- l2=strlen(b);
-
- if(l1>l2) l=l2; else l=l1;
-
- for(i=0;i<l;i++)
- {
- if(a[i]>b[i])
- return(TRUE);
- else if(b[i]>a[i])
- return(FALSE);
- }
- if(l1>l2) return(TRUE);
- return(FALSE);
- }
-
- void LeseKatalog(name)
- UBYTE *name;
- {
- UBYTE path[40];
- REGISTER ULONG adr;
- REGISTER UWORD m,s,f,i;
- register struct FileHandle *fh;
- register struct Katalog *cat;
- register struct CNode *node,*nach;
-
- sprintf(&path,"AudioCD:%s",name);
- fh=Open(&path,MODE_OLDFILE);
- if(fh!=NULL)
- {
- Katalog->Anzahl=99;
- Read(fh,Katalog,KSIZE(Katalog));
- Close(fh);
- if((strncmp(&Katalog->ID,"DISC",4)))
- return;
-
- if(Discs==0)
- {
- nach=NULL;
- }
- else
- {
- node=Liste2.lh_TailPred;
- nach=NULL;
- for(i=0;i<Discs;i++)
- {
- if((CmpStrings(node->Node.ln_Name,&Katalog->CDName))==FALSE)
- {
- /* Nodenname liegt vor CD-Name */
- nach=node;
- i=Discs;
- }
- node=node->Node.ln_Pred;
- }
- }
-
- Discs++;
- Titel+=Katalog->Anzahl;
- adr=Katalog->KE[Katalog->Anzahl-1].SAdresse+
- Katalog->KE[Katalog->Anzahl-1].TAdresse;
- m=(adr/75/60);
- s=(adr/75) % 60;
- f=(adr % 75);
- Mins+=m;
- Seks+=s;
- Frames+=f;
- cat=AllocRemember(&CatRemember,KSIZE(Katalog),MEMF_ANY);
- if(cat!=NULL)
- {
- node=AllocRemember(&CatRemember,sizeof(struct CNode),MEMF_ANY|MEMF_CLEAR);
- if(node!=NULL)
- {
- CopyMem(Katalog,cat,KSIZE(Katalog));
- node->Node.ln_Name=&cat->CDName;
- node->Katalog=cat;
- node->Update=0;
- if(nach==NULL)
- AddHead(&Liste2,node);
- else
- Insert(&Liste2,node,nach);
- }
- else
- {
- Error(GS(6,"Not enough memory!"));
- CloseAll();
- }
- }
- else
- {
- Error(GS(6,"Not enough memory!"));
- CloseAll();
- }
- }
- }
-
- void LadeKataloge()
- {
- register int test,i;
- register struct Lock *lock;
- register struct CNode *node;
- struct FileInfoBlock fib;
- UBYTE buf[40];
-
- lock=Lock("AudioCD:",ACCESS_READ);
- if(lock!=NULL)
- {
- ParsePattern("AudioCD-ID?????????",&buf,32);
- Examine(lock,&fib);
- do
- {
- test=ExNext(lock,&fib);
- if(test==-1)
- {
- if((MatchPattern(&buf,&fib.fib_FileName))==TRUE)
- LeseKatalog(&fib.fib_FileName);
- }
- } while(test==-1);
- UnLock(lock);
- }
- else
- {
- Error(GS(42,"Unable to read directory AudioCD:"));
- CloseAll();
- }
- if(Frames>74)
- {
- Seks+=(Frames / 75);
- Frames=Frames % 75;
- }
- if(Seks>59)
- {
- Mins+=(Seks/60);
- Seks=Seks % 60;
- }
- if(Mins>59)
- {
- Stds+=(Mins/60);
- Mins=Mins % 60;
- }
-
- if(ArgID!=0)
- {
- node=Liste2.lh_Head;
- for(i=0;i<Discs;i++)
- {
- if(node->Katalog->DiscID==ArgID)
- {
- ArgKNum=i;
- if(ArgTitel>node->Katalog->Anzahl) ArgTitel=node->Katalog->Anzahl;
- i=Discs;
- }
- node=node->Node.ln_Succ;
- }
- }
- }
-
- void SchreibeKatalog(k)
- struct Katalog *k;
- {
- UBYTE *ttArray[5];
- UBYTE text[80];
- register struct FileHandle *fh;
- register struct DiskObject *di;
-
- sprintf(&text,"AudioCD:AudioCD-ID#%08lx",k->DiscID);
- fh=Open(&text,MODE_NEWFILE);
- if(fh!=NULL)
- {
- Write(fh,k,KSIZE(k));
- Close(fh);
- di=GetDiskObject(&text);
- if(di!=NULL)
- {
- AudioCD.do_CurrentX=di->do_CurrentX;
- AudioCD.do_CurrentY=di->do_CurrentY;
- FreeDiskObject(di);
- }
- ttArray[0]=&k->CDName;
- ttArray[1]="*** This file was created by";
- ttArray[2]="*** MusicBox, written by";
- ttArray[3]="*** Thomas Dreibholz";
- ttArray[4]=NULL;
- AudioCD.do_ToolTypes=&ttArray;
- PutDiskObject(&text,&AudioCD);
- }
- else
- Error(GS(41,"Error writing file!"));
- }
-
-
- void KatalogeSichern()
- {
- UBYTE as;
- UBYTE text[120];
- struct CNode *node;
- int i,j;
-
- SleepPointer(KatalogWnd);
- node=Liste2.lh_Head;
- as=ASave;
- for(i=0;i<Discs;i++)
- {
- if(node->Update==1)
- {
- if(as==0)
- {
- sprintf(&text,GS(43,"Do you want to save the catalog\n%s\n"),&node->Katalog->CDName);
- ClearPointer(KatalogWnd);
- j=MultiRequest(GS(44,"Save catalog..."),&text,GS(45,"Yes, save|Save all|No!"));
- SleepPointer(KatalogWnd);
- if(j==2)
- {
- j=1;
- as=1;
- }
- }
- else
- j=1;
-
- if(j==1)
- {
- SchreibeKatalog(node->Katalog);
- node->Update=0;
- }
- }
- node=node->Node.ln_Succ;
- }
- ClearPointer(KatalogWnd);
- }
-
- void PrefsSichern()
- {
- register struct FileHandle *fh;
-
- SleepPointer(KatalogWnd);
- fh=Open("S:MusicBoxArchive.config",MODE_NEWFILE);
- if(fh!=NULL)
- {
- Write(fh,&ASave,1L);
- Close(fh);
- }
- ClearPointer(KatalogWnd);
- }
-
- void ZeigePrefs()
- {
- register struct MenuItem *item;
-
- if(KatalogWnd!=NULL)
- {
- ClearMenuStrip(KatalogWnd);
- item=KatalogMenus->NextMenu->FirstItem;
- if(ASave!=0)
- item->Flags |= CHECKED;
- else
- item->Flags &= (0xffff-CHECKED);
- SetMenuStrip(KatalogWnd,KatalogMenus);
- }
- }
-
- void PrefsLaden()
- {
- register struct FileHandle *fh;
-
- SleepPointer(KatalogWnd);
- fh=Open("S:MusicBoxArchive.config",MODE_OLDFILE);
- if(fh!=NULL)
- {
- Read(fh,&ASave,1L);
- Close(fh);
- ZeigePrefs();
- }
- ClearPointer(KatalogWnd);
- }
-
- int ControlHandler()
- {
- int iconify,i;
- struct MusicBoxMessage *mbc;
- struct CNode *node;
-
- iconify=0;
- mbc=GetMsg(ControlPort);
- do
- {
- mbc->Status=MBCS_OK;
- switch(mbc->Command)
- {
- case MBC_ICONIFY:
- iconify=1;
- break;
- case MBC_UNICONIFY:
- iconify=2;
- break;
- case MBC_VERSION:
- mbc->Args[0]=VERSION;
- break;
- case 7000:
- if(KatalogWnd==NULL)
- {
- iconify=2;
- if(mbc->Args[0]!=0)
- {
- node=Liste2.lh_Head;
- for(i=0;i<Discs;i++)
- {
- if(node->Katalog->DiscID==mbc->Args[0])
- {
- ArgKNum=i;
- ArgTitel=mbc->Args[1];
- if(ArgTitel>node->Katalog->Anzahl) ArgTitel=node->Katalog->Anzahl;
- i=Discs;
- }
- node=node->Node.ln_Succ;
- }
- }
- }
- else
- {
- WindowToFront(KatalogWnd);
- ActivateWindow(KatalogWnd);
- }
- break;
- }
- ReplyMsg(mbc);
- mbc=GetMsg(ControlPort);
- } while(mbc!=NULL);
- return(iconify);
- }
-
-
- void ZeigeLogo()
- {
- if(DisplayFont)
- {
- SetAPen(RPort,FARBE);
- SetFont(RPort,DisplayFont);
- PutText(595,222,"?");
- SetFont(RPort,TimesFont);
- }
- }
-
- void KatalogHilfe()
- {
- register struct NewAmigaGuide *amg;
- struct FileLock *lock;
- APTR ctx;
- UBYTE name[200];
-
- if(AmigaGuideBase!=NULL)
- {
- amg=AllocMem(sizeof(struct NewAmigaGuide),MEMF_CLEAR|MEMF_ANY);
- if(amg!=NULL)
- {
- amg->nag_Name="MusicBox:Archive.guide";
- SleepPointer(KatalogWnd);
- lock=NULL;
-
- if(Locale)
- {
- sprintf(&name,"MusicBox:%s/Archive.guide",Locale->loc_LanguageName);
- lock=Lock(&name,ACCESS_READ);
- if(lock!=NULL)
- {
- UnLock(lock);
- amg->nag_Name=&name;
- }
- }
-
- ctx=OpenAmigaGuide(amg,NULL);
- if(ctx!=NULL)
- CloseAmigaGuide(ctx);
- else
- Error(GS(79,"AmigaGuide is unable to load guide file!"));
-
- ClearPointer(KatalogWnd);
- FreeMem(amg,sizeof(struct NewAmigaGuide));
- }
- else
- Error(GS(6,"Not enough memory!"));
- }
- else
- Error(GS(78,"AmigaGuide is not available!"));
- }
-
- void Print()
- {
- PrintIt(KatalogWnd,AuswahlK);
- }
-
- static struct NewGadget ong[4]=
- {
- {10,28,580,150,0L,0L,0,0,0,0L},
- {10,178,580,18,0L,0L,10,PLACETEXT_IN,0,0L},
- {10,5,100,19,0L,0L,11,PLACETEXT_IN,0,0L},
- {110,5,480,19,0L,0L,11,0,0,0L}
- };
-
- void Suchen()
- {
- struct NewGadget ng[4];
-
- REGISTER BOOL ende;
- REGISTER ULONG Class;
- UWORD Code;
- struct TagItem tag[10];
- struct List Liste;
- struct Remember *Remember;
- register struct Gadget *IAddress;
- struct Screen *scr;
- struct Gadget *GadgetList,*g1,*g2,*g3,*g4;
- register int i;
- register long j;
- register struct Gadget *gad;
- register struct Window *win;
- register struct IntuiMessage *msg;
- struct VisualInfo *vi;
-
- SleepPointer(KatalogWnd);
- NewList(&Liste);
- CopyMemQuick(&ong,&ng,4*sizeof(struct NewGadget));
- scr=LockPubScreen(NULL);
- if(scr!=NULL)
- {
- vi=GetVisualInfoA(scr,NULL);
- if(vi!=NULL)
- {
- for(i=0;i<4;i++)
- {
- ng[i].ng_VisualInfo=vi;
- ng[i].ng_TextAttr=&topaz11;
- }
- ng[1].ng_GadgetText=GS(57,"_Okay");
- ng[2].ng_GadgetText=GS(508,"_Find");
- if(LowRes==TRUE)
- {
- ng[0].ng_TopEdge-=2;
- for(i=1;i<4;i++)
- ng[i].ng_Height=15;
- }
- gad=CreateContext(&GadgetList);
- if(gad!=NULL)
- {
- Remember=NULL;
- tag[0].ti_Tag=GTLV_ReadOnly;
- tag[0].ti_Data=TRUE;
- tag[1].ti_Tag=GTLV_Labels;
- tag[1].ti_Data=&Liste;
- tag[2].ti_Tag=TAG_DONE;
- g1=CreateGadgetA(LISTVIEW_KIND,gad,&ng[0],&tag);
- if(g1!=NULL)
- {
- tag[0].ti_Tag=GT_Underscore;
- tag[0].ti_Data='_';
- tag[1].ti_Tag=TAG_DONE;
- g2=CreateGadgetA(BUTTON_KIND,g1,&ng[1],&tag);
- if(g2!=NULL)
- {
- g3=CreateGadgetA(BUTTON_KIND,g2,&ng[2],&tag);
- if(g3!=NULL)
- {
- tag[0].ti_Tag=GTSL_Max;
- tag[0].ti_Data=49;
- tag[1].ti_Tag=TAG_DONE;
- g4=CreateGadgetA(STRING_KIND,g3,&ng[3],&tag);
- }
- }
- }
- }
- if(g4!=NULL)
- {
- tag[0].ti_Tag=WA_Left;
- tag[0].ti_Data=20;
- tag[1].ti_Tag=WA_Top;
- tag[1].ti_Data=15;
- tag[2].ti_Tag=WA_InnerWidth;
- tag[2].ti_Data=600;
- tag[3].ti_Tag=WA_InnerHeight;
- if(LowRes==FALSE)
- tag[3].ti_Data=203;
- else
- tag[3].ti_Data=199;
- tag[4].ti_Tag=WA_IDCMP;
- tag[4].ti_Data=CLOSEWINDOW|LISTVIEWIDCMP|IDCMP_GADGETUP|VANILLAKEY;
- tag[5].ti_Tag=WA_Flags;
- tag[5].ti_Data=ACTIVATE|WINDOWCLOSE|WINDOWDEPTH|WINDOWDRAG|WFLG_GIMMEZEROZERO;
- tag[6].ti_Tag=WA_Gadgets;
- tag[6].ti_Data=GadgetList;
- tag[7].ti_Tag=WA_Title;
- tag[7].ti_Data=GS(509,"Search Title...");
- tag[8].ti_Tag=WA_PubScreen;
- tag[8].ti_Data=scr;
- tag[9].ti_Tag=TAG_DONE;
- win=OpenWindowTagList(NULL,&tag);
- if(win!=NULL)
- {
- GTRefreshWindow(win,NULL);
- ende=FALSE;
- while(ende==FALSE)
- {
- WaitPort(win->UserPort);
- msg=GTGetIMsg(win->UserPort);
- while(msg!=NULL)
- {
- Class=msg->Class;
- Code=msg->Code;
- IAddress=msg->IAddress;
- GTReplyIMsg(msg);
- switch(Class)
- {
- case CLOSEWINDOW:
- ende=TRUE;
- break;
- case GADGETUP:
- gad=IAddress;
- switch(gad->GadgetID)
- {
- case 10:
- ende=TRUE;
- break;
- case 11:
- SleepPointer(win);
- NewList(&Liste);
- if(Remember) FreeRemember(Remember,TRUE);
- Remember=NULL;
- Find(g4->SpecialInfo->Buffer,&Remember,&Liste);
- tag[0].ti_Tag=GTLV_Labels;
- tag[0].ti_Data=&Liste;
- tag[1].ti_Tag=TAG_DONE;
- GTSetGadgetAttrsA(g1,win,NULL,&tag);
- ClearPointer(win);
- break;
- }
- break;
- case VANILLAKEY:
- switch(toupper((UBYTE)Code))
- {
- case 'O':
- case 'S':
- ende=TRUE;
- break;
- case 'U':
- case 'F':
- SleepPointer(win);
- NewList(&Liste);
- if(Remember) FreeRemember(Remember,TRUE);
- Remember=NULL;
- Find(g4->SpecialInfo->Buffer,&Remember,&Liste);
- tag[0].ti_Tag=GTLV_Labels;
- tag[0].ti_Data=&Liste;
- tag[1].ti_Tag=TAG_DONE;
- GTSetGadgetAttrsA(g1,win,NULL,&tag);
- ClearPointer(win);
- break;
- }
- break;
- }
- msg=GTGetIMsg(win->UserPort);
- }
- }
- if(Remember) FreeRemember(Remember,TRUE);
- CloseWindow(win);
- }
- else
- Error(GS(33,"Unable to open window!"));
- FreeGadgets(GadgetList);
- }
- else
- Error(GS(31,"Unable to create gadgets!"));
- FreeVisualInfo(vi);
- }
- else
- Error(GS(30,"Unable to get VisualInfo!"));
- UnlockPubScreen(NULL,scr);
- }
- else
- Error(GS(26,"Unable to lock public screen!"));
- ClearPointer(KatalogWnd);
- }
-
- void Find(pattern,rm,list)
- UBYTE *pattern;
- APTR rm;
- struct List *list;
- {
- UBYTE buffer[60],
- ucase[60];
- REGISTER BOOL titel;
- register long i,j;
- register UBYTE k,*t;
- register struct CNode *node;
- register struct Katalog *cat;
- register struct TNode *xn;
-
- k=0;
- while(pattern[k]!=0x00)
- {
- ucase[k]=toupper(pattern[k]);
- k++;
- }
- ucase[k]=0x00;
-
- ParsePattern(&ucase,&buffer,60);
- node=Liste2.lh_Head;
- for(i=0;i<Discs;i++)
- {
- cat=node->Katalog;
- titel=FALSE;
- for(j=0;j<cat->Anzahl;j++)
- {
-
- t=&cat->KE[j].Titel;
- k=0;
- while(t[k]!=0x00)
- {
- ucase[k]=toupper(t[k]);
- k++;
- }
- ucase[k]=0x00;
-
- if((MatchPattern(&buffer,&ucase))==TRUE)
- {
- if(titel==FALSE)
- {
- xn=AllocRemember(rm,sizeof(struct TNode),MEMF_CLEAR|MEMF_ANY);
- if(xn!=NULL)
- {
- xn->Node.ln_Name=&xn->Titel,
- sprintf(&xn->Titel,"%s:",&cat->CDName);
- AddTail(list,xn);
- }
- else
- {
- Error(GS(510,"Not enough memory to continue!"));
- return;
- }
- titel=TRUE;
- }
- xn=AllocRemember(rm,sizeof(struct TNode),MEMF_CLEAR|MEMF_ANY);
- if(xn!=NULL)
- {
- xn->Node.ln_Name=&xn->Titel;
- sprintf(&xn->Titel," %02d %s",j+1,&cat->KE[j].Titel);
- AddTail(list,xn);
- }
- else
- {
- Error(GS(510,"Not enough memory to continue!"));
- return;
- }
- }
- }
- if(titel==TRUE)
- {
- xn=AllocRemember(rm,sizeof(struct Node),MEMF_CLEAR|MEMF_ANY);
- xn->Node.ln_Name=&zero;
- AddTail(list,xn);
- }
- node=node->Node.ln_Succ;
- }
- }
-
-